package com.mzj.mzjaicodemother.service;

import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.service.IService;
import com.mzj.mzjaicodemother.model.dto.chathistory.ChatHistoryQueryRequest;
import com.mzj.mzjaicodemother.model.entity.ChatHistory;
import com.mzj.mzjaicodemother.model.entity.User;
import dev.langchain4j.memory.ChatMemory;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;

import java.time.LocalDateTime;

/**
 * 对话历史 服务层。
 *
 * @author 梅子酒
 */
public interface ChatHistoryService extends IService<ChatHistory> {

    /**
     * 保存对话消息
     * @param appId 应用id
     * @param message 消息
     * @param messageType 消息类型
     * @param userId 用户id
     * @return 是否成功
     */
    boolean addChatMessage(Long appId,String message,String messageType,Long userId);

    /**
     * 分页查询某应用的对话记录
     * @param appId 应用id
     * @param pageSize 每页条数
     * @param lastCreateTime 游标（上次消息创建的时间）
     * @param loginUser 用户信息
     * @return
     */
    Page<ChatHistory> listAppChatHistoryByPage(Long appId, int pageSize,
                                               LocalDateTime lastCreateTime,
                                               User loginUser);

    /**
     * 根据应用id删除对话历史
     * @param appId 应用id
     * @return 是否成功
     */
    boolean deleteByAppId(Long appId);

    /**
     * 构造查询条件
     * @param chatHistoryQueryRequest 对话历史查询请求对象
     * @return 包装好的请求对象
     */
    QueryWrapper getQueryWrapper(ChatHistoryQueryRequest chatHistoryQueryRequest);


    /**
     * 加载对话历史到对话记忆里
     * @param appId 应用id
     * @param chatMemory 对话记忆
     * @param maxCount 需要加载的消息的条数
     * @return 成功的消息条数
     */
    int loadChatHistoryToMemory(Long appId, MessageWindowChatMemory chatMemory, int maxCount);
}
